#ifndef SIMPLEKEY_H
#define SIMPLEKEY_H

#include <Arduino.h>

/* 按键状态枚举 */
enum class KeyState {
  Idle = 0,        // 空闲状态（按键未按下）
  ShortPress,      // 短按状态（按键按下后立即释放）
  LongPress        // 长按状态（按键按下持续时间超过长按时间）
};

/* 按键事件回调函数类型 */
typedef void (*KeyEventCallback)(void);

/**
 * @brief SimpleKey类 - 简单易用的按键处理类
 * @details 通过状态机和事件注册机制实现高效的按键处理
 */
class SimpleKey {
private:
  static const unsigned long DEBOUNCE_TIME = 50;    // 去抖动时间(ms)，避免按键抖动导致错误触发
  static const unsigned long LONG_PRESS_TIME = 1000; // 长按时间(ms)，超过此时间被认为是长按
  
  uint8_t          pin;                 // 按键引脚
  KeyState         state;               // 按键状态
  unsigned long    pressTime;           // 按键按下时间（用于计算长按时间）
  KeyEventCallback shortPressCallback;  // 短按事件回调函数指针
  KeyEventCallback longPressCallback;   // 长按事件回调函数指针
  
public:
  /**
   * @brief 构造函数
   * @param pin 按键引脚编号
   */
  SimpleKey(uint8_t pin);
  
  /**
   * @brief 更新按键状态机（需要在主循环中周期性调用）
   */
  void update();
  
  /**
   * @brief 注册短按事件回调函数
   * @param callback 回调函数指针
   */
  void onShortPress(KeyEventCallback callback);
  
  /**
   * @brief 注册长按事件回调函数
   * @param callback 回调函数指针
   */
  void onLongPress(KeyEventCallback callback);
  
  /**
   * @brief 获取当前按键状态
   * @return 当前按键状态
   */
  KeyState getState() const { return state; }
  
  /**
   * @brief 检查按键是否被按下
   * @return true表示按下，false表示未按下
   */
  bool isPressed() const;
};

#endif // SIMPLEKEY_H